判断操作符——@>、?
-
@>- 判断
前者是否包含后者,可用于多种结构 - 用于jsonb
SELECT '{ "a":1, "b":2 }'::jsonb @> '{"b":2}'::jsonb- 返回true,因为 前面 包含 后面
- 用于array
SELECT ARRAY[1,4,3] @> ARRAY[3,1,3]- 返回true,因为 前面 含有 后面的所有元素
- 判断
-
?- 判断
key是否存在 - 用于jsonb
- 常规用法
SELECT '{ "a":1, "b":2 }'::jsonb ? 'b'- 返回true,因为前面含有键(key)为b
SELECT '["a", "b", "c"]'::jsonb ? 'b'- 返回true,因为前面含有数组元素(key)为b
- 变种
?|SELECT '{ "a":1, "b":2, "c":3 }'::jsonb ?| array['b', 'd']- 只要后面array中任意一个元素,在前面作为key出现过,则返回true
- 变种
?&SELECT '["a", "b", "c"]'::jsonb ?& array['a', 'b']- 后面array中全部元素,都要在前面作为key出现过,才返回true
- 常规用法
- 判断
-
一个例子
SELECT vl.* FROM video_lesson vl WHERE vl.status = 'finished' AND vl.ctype = 'assistant' AND vl.members @> '{"members":["f3c45fb6-2558-4332-b7cb-5327aebbdca2"]}' ORDER BY vl.start_time